package com.mxd.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.baomidou.mybatisplus.MybatisConfiguration;
import com.baomidou.mybatisplus.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.entity.GlobalConfiguration;
import com.baomidou.mybatisplus.enums.DBType;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
@MapperScan(value = "com.mxd.mapper")
@EnableTransactionManagement
public class MybatisPlusConfig {

	   @Autowired
	    private Environment environment;
	    private RelaxedPropertyResolver propertyResolver;
	    @Autowired
	    private DataSource dataSource;
	    @Autowired
	    private MybatisProperties properties;
	    @Autowired
	    private ResourceLoader resourceLoader = new DefaultResourceLoader();
	    @Autowired(required = false)
	    private Interceptor[] interceptors;
	    @Autowired(required = false)
	    private DatabaseIdProvider databaseIdProvider;

	    /**
	     * @Description : mybatis-plus SQL执行效率插件【生产环境可以关闭�??
	     */
	    @Bean
	    public PerformanceInterceptor performanceInterceptor() {
	        return new PerformanceInterceptor();
	    }

	    /**
	     * 配置DataSource
	     * @return
	     * @throws SQLException
	     */
	    @Bean
	    public DataSource druidDataSource() throws SQLException {
	        this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource.");

	        System.out.println("====================注入druid!====================");
	        DruidDataSource datasource = new DruidDataSource();
	        datasource.setUrl(propertyResolver.getProperty("url"));
	        datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name"));
	        datasource.setUsername(propertyResolver.getProperty("username"));
	        datasource.setPassword(propertyResolver.getProperty("password"));
	        datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initial-size")));
	        datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("min-idle")));
	        datasource.setMaxWait(Long.valueOf(propertyResolver.getProperty("max-wait")));
	        datasource.setMaxActive(Integer.valueOf(propertyResolver.getProperty("max-active")));
	        datasource.setMinEvictableIdleTimeMillis(Long.valueOf(propertyResolver.getProperty("min-evictable-idle-time-millis")));
	        try {
	            datasource.setFilters(propertyResolver.getProperty("filters"));
	        } catch (SQLException e) {
	            e.printStackTrace();
	        }
	        return datasource;
	    }

	    /**
	     * @Description : mybatis-plus分页插件
	     */
	    @Bean
	    public PaginationInterceptor paginationInterceptor() {
	        PaginationInterceptor page = new PaginationInterceptor();
	        page.setDialectType("mysql");
	        return page;
	    }

	    /**
	     * 这里全部使用mybatis-autoconfigure 已经自动加载的资源�?�不手动指定
	     * 配置文件和mybatis-boot的配置文件同�?
	     * @return
	     */
	    @Bean
	    public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {
	        MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
	        mybatisPlus.setDataSource(dataSource);
	        mybatisPlus.setVfs(SpringBootVFS.class);
	        if (StringUtils.hasText(this.properties.getConfigLocation())) {
	            mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
	        }
	        mybatisPlus.setConfiguration(properties.getConfiguration());
	        if (!ObjectUtils.isEmpty(this.interceptors)) {
	            mybatisPlus.setPlugins(this.interceptors);
	        }
	        // MP 全局配置，更多内容进入类看注�?
	        GlobalConfiguration globalConfig = new GlobalConfiguration();
	        globalConfig.setDbType(DBType.MYSQL.name());
	        // ID 策略 AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID")
	        globalConfig.setIdType(2);
	        mybatisPlus.setGlobalConfig(globalConfig);
	        MybatisConfiguration mc = new MybatisConfiguration();
	        mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
	        mybatisPlus.setConfiguration(mc);
	        if (this.databaseIdProvider != null) {
	            mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);
	        }
	        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
	            mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
	        }
	        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
	            mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
	        }
	        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
	            mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());
	        }
	        return mybatisPlus;
	    }

	    /**
	     * 注册�?个StatViewServlet
	     * @return
	     */
	    @Bean
	    public ServletRegistrationBean DruidStatViewServle(){
	        //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
	        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
	        //添加初始化参数：initParams
	        //白名单：
	        // servletRegistrationBean.addInitParameter("allow","127.0.0.1");
	        //IP黑名�? (存在共同时，deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
	        // servletRegistrationBean.addInitParameter("deny","192.168.1.73");
	        //登录查看信息的账号密�?.
	        servletRegistrationBean.addInitParameter("loginUsername","root");
	        servletRegistrationBean.addInitParameter("loginPassword","root");
	        //是否能够重置数据.
	        servletRegistrationBean.addInitParameter("resetEnable","false");
	        return servletRegistrationBean;
	    }

	    /**
	     * 注册�?个：filterRegistrationBean
	     *
	     * @return
	     */
	    @Bean
	    public FilterRegistrationBean druidStatFilter(){
	        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
	        //添加过滤规则.
	        filterRegistrationBean.addUrlPatterns("/*");
	        //添加不需要忽略的格式信息.
	        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
	        return filterRegistrationBean;
	    }

	
	
	
	
}
